import 'package:dio/dio.dart';
import 'package:flutter_harmony_order/utils/auth.dart';

class RequestDio {
  // 有个地方可以设置dio的基础地址
  final Dio _dio = Dio();
  RequestDio() {
    // 针对dio的基础地址进行设置
    // _dio.options.baseUrl = GlobalVariable.BASE_URL; // 设置基础地址
    // _dio.options.receiveTimeout =
    //     const Duration(seconds: GlobalVariable.NET_WORK_TIME); // 接收时间
    // _dio.options.sendTimeout =
    //     const Duration(seconds: GlobalVariable.NET_WORK_TIME); // 发送超时时间
    _dio
      ..options.baseUrl = "https://meikou-api.itheima.net"
      ..options.connectTimeout = const Duration(seconds: 20)
      ..options.receiveTimeout = const Duration(seconds: 20);

    // axios 和 rcp的拦截器
    // 添加请求和响应拦截器
    _registerInterceptors(); // 注册拦截器
  }
  _registerInterceptors() {
    _dio.interceptors.add(
      InterceptorsWrapper(
          // 请求拦截器
          onRequest: (request, handler) {
        // 在这里注入token
        request.headers["Authorization"] = "Bearer ${TokenManager.token}";

        // request里面是请求参数
        handler.next(request);
      }, onResponse: (response, handler) {
        // response是响应结果
        // http业务状态码 200 -300 之间是成功的
        if (response.statusCode! >= 200 && response.statusCode! < 300) {
          handler.next(response); // 处理数据  这里可以处理错误
        } else {
          // 加401判断
          handler.reject(DioException(requestOptions: response.requestOptions));
        }
      },
          // 错误拦截器
          onError: (exception, handler) async {
        handler.next(exception); // 抛出错误
      }),
    );
  }

  // 换取token

  // 获取方法
  Future get(String url, {Map<String, dynamic>? params}) async {
    final result = await _dio.get(url, queryParameters: params);
    // 需要对数据进行二次处理
    return _handleResponse(result);
  }

  // 上传接口
  Future upload(String url, {FormData? data}) async {
    final result = await _dio.post(url, data: data);
    // 需要对数据进行二次处理
    return _handleResponse(result);
  }

  Future post(String url, {Map<String, dynamic>? data}) async {
    final result = await _dio.post(url, data: data);
    // 需要对数据进行二次处理
    return _handleResponse(result);
  }

  Future delete(String url,
      {Map<String, dynamic>? data, Map<String, dynamic>? params}) async {
    final result = await _dio.delete(url, queryParameters: params, data: data);
    // 需要对数据进行二次处理
    return _handleResponse(result);
  }

  Future put(String url,
      {Map<String, dynamic>? data, Map<String, dynamic>? params}) async {
    final result = await _dio.put(url, queryParameters: params, data: data);
    // 需要对数据进行二次处理
    return _handleResponse(result);
  }

  // 处理返回数据结构
  _handleResponse(Response<dynamic> result) {
    if (result.data["code"] == "1") {
      // 此时说明请求成功 返回正确的数据
      return result.data["result"];
    }
    // 提示个消息 使用第三方插件的toast弹出
    throw Exception(result.data["message"]);
  }
}

final requestDio = RequestDio();
